import { defineWrappedResponseHandler } from "#server/utils/handler"; import { R } from "#server/utils/response"; import { resolveCharacterIdentity } from "#server/service/character/identity"; import { getCharacterSessionByIdAndUser } from "#server/service/character/session"; import { getCharacterCardBySlug } from "#server/service/character/character-card"; import { abortCharacterStream } from "#server/service/character/abort"; import { getCharacterStreamBuffer, markCharacterBufferDone } from "#server/service/character/stream-buffer"; export default defineWrappedResponseHandler(async (event) => { const slug = getRouterParam(event, "slug"); if (!slug) { return R.error("参数无效", null); } const card = await getCharacterCardBySlug(slug); if (!card) { return R.error("角色不存在", null); } const identity = await resolveCharacterIdentity(event); if (!identity.userId && !identity.tempToken) { return R.error("请先登录或创建会话", null); } const body = await readBody(event); const { sessionId } = body as { sessionId?: string }; if (!sessionId) { return R.error("缺少 sessionId 参数", null); } const session = await getCharacterSessionByIdAndUser(sessionId, identity.userId, identity.tempToken); if (!session) { return R.error("会话不存在", null); } if (session.cardId !== card.id) { return R.error("会话不属于该角色", null); } const aborted = abortCharacterStream(sessionId); if (!aborted) { const buf = getCharacterStreamBuffer(sessionId); if (buf && !buf.done) { markCharacterBufferDone(sessionId); } } return R.success({ aborted }); });